package io.yunho.yunho.interview.two.juc;

/**
 * Created by Administrator on 2020/4/10.
 * 单例模式线程安全研究
 */
public class SingletonDemo {
//    懒汉 饿汉
    private static volatile SingletonDemo instance =null;

    private SingletonDemo(){
        System.out.println(Thread.currentThread().getName()+"******\t 我是构造方法 ");
    }
    //synchronized 是可以的 但是太重了 数据一致性保证了 但是并发下降了
    //DCL模式（Double Check Lock双端检锁机制） 有可能存在指令重排导致
    // 多线程情况下某一个线程出现执行顺序不一致，从而导致多个实例，需要加volatile规避指令重排的风险
    public static synchronized SingletonDemo getInstance(){
        if (instance==null){
            synchronized (SingletonDemo.class){
                if(instance==null){
                    instance=new SingletonDemo();
                }
            }
        }
        return instance;
    }

    public static void main(String[] args) {
        //单线程（main线程的操作动作）
//        System.out.println(SingletonDemo.getInstance()==SingletonDemo.getInstance());
//        System.out.println(SingletonDemo.getInstance()==SingletonDemo.getInstance());
//        System.out.println(SingletonDemo.getInstance()==SingletonDemo.getInstance());

        //并发多线程后，情况发生了很大变化
        for(int i=1;i<=10;i++){
            new Thread(()->{
                SingletonDemo.getInstance();
            },String.valueOf(i)).start();
        }
    }
}
